package com.example.qt.ptplatform.service.impl;

import com.example.qt.ptplatform.entity.LoginLog;
import com.example.qt.ptplatform.entity.Torrent;
import com.example.qt.ptplatform.exception.CheatingException;
import com.example.qt.ptplatform.mapper.DownloadMapper;
import com.example.qt.ptplatform.mapper.LoginLogMapper;
import com.example.qt.ptplatform.mapper.TorrentMapper;
import com.example.qt.ptplatform.utils.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Service
public class CheatingDetectionServiceImpl {

    @Autowired
    private LoginLogMapper loginLogMapper;

    @Autowired
    private TorrentMapper torrentMapper;

    @Autowired
    private DownloadMapper downloadMapper;

    @Value("${cheating.download.max-hourly-gb:10}") // 配置单位为GB
    private Double MAX_HOURLY_GB;

    // 检查用户是否频繁更换 IP 地址
    public String checkFrequentIPChange(Integer userId) {
        // 查询该用户最近 24 小时内的登录记录
        List<LoginLog> loginLogs = loginLogMapper.getRecentLoginLogs(userId, LocalDateTime.now().minusDays(1));

        // 用于存储唯一的 IP 地址
        Set<String> uniqueIps = new HashSet<>();
        for (LoginLog log : loginLogs) {
            uniqueIps.add(log.getIpAddress());
        }

        // 如果在过去 24 小时内，用户的 IP 地址种类超过 5 个，认为是频繁更换 IP
        if (uniqueIps.size() > 5) {
            return "疑似作弊：频繁更换 IP 地址";
        }
        return null;  // 如果没有问题，返回 null
    }

    // 检测用户下载速率
    public String checkDownloadRate(Integer userId) {

        // 2. 获取用户过去1小时的累计下载量GB
        ZonedDateTime startTime = ZonedDateTime.now().minusHours(1);
        Float recentDownloadGB = downloadMapper.sumUserDownloadInPeriod(userId, startTime);

        // 打印出最大允许下载量（GB）
        System.out.println("最大允许下载量（GB）: " + MAX_HOURLY_GB + "最大允许下载量（GB）: " + recentDownloadGB);

        // 3. 检测速率是否超限
        if (recentDownloadGB > MAX_HOURLY_GB) {
            // 转换回GB生成友好提示
            double recentGB = recentDownloadGB;
            return String.format("下载速率异常: 1小时内已下载 %.2f GB，超过阈值 %.2f GB", recentGB, MAX_HOURLY_GB);
        }
        return null;  // 如果没有问题，返回 null
    }

    public String checkFileTampering(Integer userId) {
        // 获取用户上传的所有种子文件
        List<Torrent> userTorrents = torrentMapper.getTorrentsByUserId(userId);

        for (int i = 0; i < userTorrents.size(); i++) {
            for (int j = i + 1; j < userTorrents.size(); j++) {
                Torrent torrent1 = userTorrents.get(i);
                Torrent torrent2 = userTorrents.get(j);

                // 如果种子文件名相同，但哈希值不同，说明种子文件可能被篡改
                if (torrent1.getRealFilename().equals(torrent2.getRealFilename()) &&
                        !torrent1.getInfoHash().equals(torrent2.getInfoHash())) {
                    return String.format("文件 %s 可能被篡改，上传的哈希值与服务器记录不一致。",
                            torrent1.getRealFilename());
                }
            }
        }

        return null;  // 没有检测到篡改
    }

}

